#[macro_export]
macro_rules! request {
    // 基本模式 - 完整参数
    ($method:ident, $url:expr, $data:expr, $headers:expr) => {{
        let client = reqwest::Client::new();
        let mut req = client.$method($url);

        // 处理请求数据
        if let Some(data) = $data {
            req = match stringify!($method) {
                "post" | "put" | "patch" => req.json(&data),
                "get" | "delete" => req.query(&data),
                _ => panic!("不支持的HTTP方法: {}", stringify!($method)),
            };
        }

        // 处理请求头
        if let Some(headers) = $headers {
            if let serde_json::Value::Object(map) = headers {
                for (key, val) in map {
                    if let Some(val_str) = val.as_str() {
                        req = req.header(
                            reqwest::header::HeaderName::from_bytes(key.as_bytes())
                                .unwrap_or_else(|_| panic!("无效的请求头名称: {}", key)),
                            reqwest::header::HeaderValue::from_str(val_str)
                                .unwrap_or_else(|_| panic!("无效的请求头值: {}", val_str)),
                        );
                    } else {
                        req = req.header(
                            reqwest::header::HeaderName::from_bytes(key.as_bytes())
                                .unwrap_or_else(|_| panic!("无效的请求头名称: {}", key)),
                            reqwest::header::HeaderValue::from_str(&val.to_string())
                                .unwrap_or_else(|_| panic!("无效的请求头值: {}", val)),
                        );
                    }
                }
            }
        }

        // 发送请求并处理响应
        req.send()
            .await
            .unwrap_or_else(|e| panic!("请求发送失败: {}", e))
            .json::<serde_json::Value>()
            .await
            .unwrap_or_else(|e| panic!("解析JSON响应失败: {}", e))
    }};

    // 简化模式 - 只有URL
    ($method:ident, $url:expr) => {
        request!(
            $method,
            $url,
            None::<serde_json::Value>,
            None::<serde_json::Value>
        )
    };

    // 简化模式 - 只有URL和body
    ($method:ident, $url:expr, body: $body:expr) => {
        request!($method, $url, Some($body), None::<serde_json::Value>)
    };

    // 简化模式 - 只有URL和headers
    ($method:ident, $url:expr, headers: $headers:expr) => {
        request!($method, $url, None::<serde_json::Value>, Some($headers))
    };

    // 简化模式 - URL, headers 和 body
    ($method:ident, $url:expr, headers: $headers:expr, body: $body:expr) => {
        request!($method, $url, Some($body), Some($headers))
    };

    // 简化模式 - URL, body 和 headers (顺序不同)
    ($method:ident, $url:expr, body: $body:expr, headers: $headers:expr) => {
        request!($method, $url, Some($body), Some($headers))
    };

    // 参数化API响应转换为特定类型
    ($method:ident, $url:expr, as: $type:ty) => {{
        let resp = request!(
            $method,
            $url,
            None::<serde_json::Value>,
            None::<serde_json::Value>
        );
        serde_json::from_value::<$type>(resp)
            .unwrap_or_else(|e| panic!("无法将响应转换为指定类型: {}", e))
    }};

    // 参数化API响应转换为特定类型 (带body)
    ($method:ident, $url:expr, body: $body:expr, as: $type:ty) => {{
        let resp = request!($method, $url, Some($body), None::<serde_json::Value>);
        serde_json::from_value::<$type>(resp)
            .unwrap_or_else(|e| panic!("无法将响应转换为指定类型: {}", e))
    }};

    // 参数化API响应转换为特定类型 (带headers)
    ($method:ident, $url:expr, headers: $headers:expr, as: $type:ty) => {{
        let resp = request!($method, $url, None::<serde_json::Value>, Some($headers));
        serde_json::from_value::<$type>(resp)
            .unwrap_or_else(|e| panic!("无法将响应转换为指定类型: {}", e))
    }};

    // 参数化API响应转换为特定类型 (带body和headers)
    ($method:ident, $url:expr, headers: $headers:expr, body: $body:expr, as: $type:ty) => {{
        let resp = request!($method, $url, Some($body), Some($headers));
        serde_json::from_value::<$type>(resp)
            .unwrap_or_else(|e| panic!("无法将响应转换为指定类型: {}", e))
    }};

    // 参数化API响应转换为特定类型 (带body和headers，顺序不同)
    ($method:ident, $url:expr, body: $body:expr, headers: $headers:expr, as: $type:ty) => {{
        let resp = request!($method, $url, Some($body), Some($headers));
        serde_json::from_value::<$type>(resp)
            .unwrap_or_else(|e| panic!("无法将响应转换为指定类型: {}", e))
    }};
}

#[tokio::test]
async fn test() {
    // 基本测试
    let res = request!(
        get,
        "https://api.bilibili.com/pgc/web/season/home/top",
        body: serde_json::json!({"season_type": 1})
    );
    println!("{}", res);

    // 可以添加更多测试用例
    // 例如:
    // let typed_res = request!(
    //     get,
    //     "https://api.bilibili.com/pgc/web/season/home/top",
    //     body: serde_json::json!({"season_type": 1}),
    //     as: MyResponseType
    // );
}
